package com.redhat.ceylon.eclipse.core.builder; import static java.lang.Math.max; import java.util.Collection; import java.util.ConcurrentModificationException; import java.util.List; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import com.redhat.ceylon.model.typechecker.model.Declaration; import com.redhat.ceylon.model.typechecker.model.Module; import com.redhat.ceylon.model.typechecker.model.Package; import com.redhat.ceylon.model.typechecker.model.TypedDeclaration; final class WarmupJob extends Job { private final IProject project; WarmupJob(IProject project) { super("Warming up completion processor for " + project.getName()); this.project = project; } @Override protected IStatus run(IProgressMonitor monitor) { monitor.beginTask("Warming up completion processor", 100000); Collection<Module> modules = CeylonBuilder.getProjectDeclaredSourceModules(project); monitor.worked(10000); try { for (Module m: modules) { List<Package> packages = m.getAllVisiblePackages(); for (Package p: packages) { if (p.isShared()) { for (Declaration d: p.getMembers()) { if (d.isShared()) { if (d instanceof TypedDeclaration) { ((TypedDeclaration) d).getType(); } //this one really slows it down! /*if (d instanceof Functional) { ((Functional) d).getParameterLists(); }*/ } } } } monitor.worked(90000/max(modules.size(),1)); if (monitor.isCanceled()) { return Status.CANCEL_STATUS; } } } catch (ConcurrentModificationException cme) { //expected, if a build starts during warmup } monitor.done(); return Status.OK_STATUS; } }